<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        /*
            var
                使用var声明的变量，既是顶级变量(顶层对象window的属性)也是全局变量
                使用var声明的变量存在变量提升的情况
                使用var可以对一个变量进行重复声明，后者覆盖前者
                在函数中再次使用var声明的变量是局部的，不使用那就是全局的

            let
                let所声明的变量只在let命令所在的代码块中生效
                let不存在变量提升
                let不允许在相同的作用域下重复声明

            const
                const声明一个只读的常量，一旦声明，常量的值就不能改变
                const一旦声明，就必须赋值
                其他与let相同

            区别：
                1. var存在变量提升，let和const不会
                2. var可以重复声明，let和const不能
                3. var和let可以只声明不赋值，const不能
                4. var和let声明的变量可以修改值，const不能
                5. let和const有块级作用域，var不存在
        */ 

        console.log(a);//并没有报错，而是undefined，这就是变量提升
        var a = 10;
        let b = 20;
        const c = 30;
        console.log(window.a,window.b,window.c);//可以发现，var在全局作用域声明的变量会挂在window上。但let和const不会
        
        var a = 30;//即便上面声明了a，var依然是可以重复声明的，且会后者覆盖前者
        // let b = 40;//爆红，提示b在前面已经被声明过了
        // const c = 50;//爆红，提示c在前面已经被声明过了


        console.log(num1);//报错
        let num1 = 1;


    </script>
</body>
</html>